<?php
/* ------------------------------------------------------------------------
 * AION-KOREA Admin Control Panel
 *
 * @version 1.0
 * @author Taro6222 (AION-KOREA Admin CP main Developer)
 * @link http://redmine.aionkorea.org/projects/ak-admin-cp
 * @license http://creativecommons.org/licenses/by-nc-sa/3.0/deed.ko
 * @APM http://www.apachefriends.org/en/xampp.html
 *
------------------------------------------------------------------------ */

class common
{
	/**
	 * 
	 * getInstance
	 */
	public static function getInstance()
	{
		if ( is_null( self::$instance ) )
		{
			self::$instance = new self();
		}
		return self::$instance;
	}


	/**
	 * 데이터베이스 접속 (DB가 한번이라도 접속되면 유지되므로 부하가 없음)
	 * 1 로그인DB
	 * 2 게임DB
	 * 
	 * @param str $type
	 */
	public static function dbConnections( $type=1 )
	{
		$db = null;
		if ( file_exists( 'var/config/config.php' ) ) {
			include 'var/config/config.php';

			$database = ( $type == 1 ) ? $db_login_server : $db_game_server;

			$params = array(
			    'host'           => $db_host,
			    'username'       => $db_user,
			    'password'       => $db_password,
			    'dbname'         => $database
			);

			$db = Zend_Db::factory('Pdo_Mysql', $params);
			$db->getProfiler()->setEnabled(true);
			$db->getConnection()->exec( 'set names utf8' );
		}

		return $db;
	}


	/**
	 * admincp 세션체크
	 * 
	 * @param unknown_type $uri
	 */
	public static function admincpSession( $uri=null )
	{
		if ( empty( $_SESSION['admincp_session_id'] ) || $_SESSION['admincp_session_access_level'] != 5 ) {
			header( "Location: /?admincp=auth-login" );
		}
	}


	public static function checkSession( $uri )
	{
		if ( empty( $_SESSION['user_session_id'] ) ) {
			header( "Location: /?module=user-login&uri={$uri}" );
		}
	}

	/**
	 * 한글인지 검사하는 함수
	 * 
	 * @param unknown_type $char
	 */
	public static function isHangul($char) {
		# 특정 문자가 한글의 범위내(0xA1A1 - 0xFEFE)에 있는지 검사
		$char = ord($char);
		if($char >= 0xa1 && $char <= 0xfe) $ret = true;
		else $ret = false;

		return $ret;
	}

	public static function str_replace_once($str_pattern, $str_replacement, $string) {
		if (strpos($string, $str_pattern) !== false){ 
			$occurrence = strpos($string, $str_pattern); 
			return substr_replace($string, $str_replacement, strpos($string, $str_pattern), strlen($str_pattern)); 
		} 
		
		return $string; 
	} 

	/**
	 * 
	 * uri의 링크 값을 치환하는 함수
	 * 
	 * @param unknown_type $link
	 * @param unknown_type $text
	 */
	public static function linkReplace($link, $text)
	{
		$getUri = $_SERVER['REQUEST_URI'];
		if ( $_SERVER['QUERY_STRING'] != '' ) $query_flag = '&';

		if ( isset( $_GET[$link] ) ) {
			$get = $_GET[$link];
			if ( common::isHangul( $get ) ) { $get = urldecode( $get ); }
			$getUri = urldecode( $getUri );
			$ret = str_replace( $link.'='.$get, $link.'='.$text, $getUri );
		}
		else {
			$ret = ( $getUri.$query_flag.$link.'='.$text );
		}

		return $ret;
	}

	public static function selectOption( $array, $default )
	{
		$ret = '';
		foreach( $array as $key => $var )
		{
			$selected = ( $key == $default ) ? ' selected' : '';
			$ret .= "<option value=\"{$var}\"{$selected}>{$key}</option>\r";
		}

		return $ret;
	}

	/**
	 * 
	 * 운영체제가 리눅스인지 윈도인지 확인
	 * 
	 * @param unknown_type $path
	 * @param unknown_type $os
	 */
	public static function absolutePath( $path, $os = null )
	{
		if ( $os === null )
		{
			$os = 'Linux';
			$uname = php_uname( 's' );
			if ( substr( $uname, 0, 7 ) == 'Windows' )
			{
				$os = 'Windows';
			}
		}

		switch ( $os )
		{
			case 'Windows':
				// Sanitize the paths to use the correct directory separator for the platform
				$path = str_replace( '/', '\\', $path );
				break;
			case 'Mac':
			case 'Linux':
			case 'FreeBSD':
			default:
		}
		return $path;
	}

	/**
	 * 
	 * 전체 페이지 수를 구하는 함수
	 * 
	 * @param unknown_type $currentPage
	 * @param unknown_type $perArticle
	 * @param unknown_type $total
	 */
	public static function pageTranslation( $currentPage, $perArticle, $total )
	{
		// 보통 글 수를 페이지 당 글 수로 나누어 전체 페이지를 구함
		// 나눈 값은 정수형으로 변환하며 정확히 나누어 떨어지지 않으면 1을 더함
		if ($total % $perArticle)
		{
			$pages['all'] = @intval($total / $perArticle) + 1;
		}
		else
		{
			$pages['all'] = @intval($total / $perArticle);
		}
	
		// $page 값이 있으면 그 값을 $pages['cur'] 값으로 대입함
		$pages['current'] = $currentPage;
	
		// $pages['cur'] 값이 전체 페이지 수보다 클 경우 전체 페이지 값을 대입함
		if ($pages['current'] > $pages['all'])
		{
			$pages['current'] = $pages['all'];
		}
	
		// $pages['no'] 값이 없으면 $pages['cur'] 값을 참고하여 대입함. 목록에서
		// 불러올 글의 시작 번호로 사용됨
		$num = ($pages['current'] - 1) * $perArticle;
		$pages['no'] = ( $num < 0 ) ? 0 : $num;
	
		// $pages['cur'] 값에 따라 이전(pre), 다음(nex) 페이지 값을 대입함
		if ($pages['current'] > 1)
		{
			$pages['prev'] = $pages['current'] - 1;
		}
		if ($pages['current'] < $pages['all'])
		{
			$pages['next'] = $pages['current'] + 1;
		}
		$pages['perArticle'] = $perArticle;

		return $pages;
	}

	/**
	 * 
	 * 현재 페이지의 앞, 뒤 페이지를 정해준 갯수($num)만큼 출력하는 함수
	 * 
	 * @param unknown_type $currentPage
	 * @param unknown_type $page
	 * @param unknown_type $num
	 * @param unknown_type $url
	 */
	public static function buildTranslation( $currentPage, $page, $num, $url )
	{
	 $totalPage = $page['all'];
	 if ( !$currentPage )
		{
			return "&nbsp;";
		}

		$d0 = $currentPage - $num - 1;
		$d1 = $totalPage - ( $currentPage + $num );

	 if ($d0 < 1)
		{
			$num_p = $num - $d0;
			$num_m = $num_p - ( $num * 2 );
		}
		else if ( $d1 < 1 )
		{
			$num_p = $num + $d1;
			$num_m = $num_p - ( $num * 2 );
		}
		else
		{
			$num_p = $num;
			$num_m = -$num;
		}

		// 현재 블럭의 시작
		$startnum = $currentPage + $num_m;
	 if ( $startnum <= 0 )
		{
			$startnum = 1;
		}

		// 현재 블럭의 끝
		$lastnum = $currentPage + $num_p;
	 if ( $lastnum > $totalPage )
		{
			$lastnum = $totalPage;
		}

		$str = "";

		$numEnd   = $page['perArticle'] * $page['current'];
		$numStart = ($numEnd - $page['perArticle'])+1;

		// 처음 페이지 링크
		if ( $currentPage != "1" && $d0 > 0 )
		{
			$link = str_replace( "{page}", 1, $url );
			$str .= "<a href=\"$link\" onfocus=\"blur()\" title=\"\">First</a> ";

			$p = ( $startnum - $num ) - 1 ;
			$p = ( $p < 1 ) ? 1 : $p;
			$link = str_replace( "{page}", $p, $url );
			$str .= "<a href=\"$link\" onfocus=\"blur()\" title=\"\">« Previous</a> ";
		}
		else {
			$str .= " First « Previous ";
		}

		// 지정된 수 만큼 페이지 링크
	 if ( $totalPage < $num * 2 + 1 )
		{
			$pagechk = $num * 2;
			for( $co = $num_m; $co <= $num_p; $co++ )
			{
				$repages = $currentPage + $co;
			 if ( $repages > "0" && $repages > $num_p - $num * 2 && $repages <= $totalPage )
				{
				 if ( $co )
					{
						$page = $currentPage + $co;

						$link = str_replace( "{page}", $page, $url );
						$str .= " <a href=\"$link\" onfocus=\"blur()\">{$page}</a>";
					}
					else
					{
						$str .= " <B>{$numStart}-{$numEnd}</B> of {$totalPage}";
					}
				}
			}
		}
		else
		{
			$pagechk = $totalPage;
			for( $co = $num_m; $co <= $num_p; $co++ )
			{
			 if ( $currentPage + $co <= $totalPage )
				{
				 if ( $co )
					{
						$page = $currentPage + $co;
						$link = str_replace( "{page}", $page, $url );
						$str .= " <a href=\"$link\" onfocus=\"blur()\">{$page}</a> ";
					}
					else
					{
						$str .= " <B>{$numStart}-{$numEnd}</B> of {$totalPage}";
					}
				}
			}
		}

		// 마지막 페이지 링크
	 if ( $currentPage != $totalPage && $d1 > 0 )
		{
			// 다음블럭 이동
			$p = $num + ( $lastnum + 1 );
			$p = ( $p > $totalPage ) ? $totalPage : $p;
			$link = str_replace( "{page}", $p, $url );
			$str .= " <a href=\"$link\" onfocus=\"blur()\" title=\"\">Next »</a> ";

			$link = str_replace( "{page}", $totalPage, $url );
			$str .= " <a href=\"$link\" onfocus=\"blur()\" title=\"\">Last</a> ";
		}
		else {
			$str .= " Next » Last ";
		}

		return $str;
	}

	/**
	 * 문자열을 일정한 길이로 자르는 함수
	 *
	 * 한글을 한바이트 단위로 잘리는 경우를 막고 대문자가 많이 쓰인 경우
	 * 소문자와의 크기 비율 정도(1.5?)에 따라 문자열을 자름
	 *
	 * @param unknown_type $str
	 * @param unknown_type $len
	 * @return string
	 */
	public static function cutString($s,$l)
	{
		if(strlen($s) > $l)
		{
			$s = substr($s,0,$l);
			$s = preg_replace("/(([\x80-\xFE].)*)[\x80-\xFE]?$/","\\1",$s);
			$s .= "..";  //문자열 자르고나서 뒤에 붙이는거예요.
		}
		return $s;
	}


	public static function object2array( $object )
	{
	    $return = null;
	
	    if(is_array($object))
	        foreach($object as $key => $value)
	            $return[$key] = common::object2array($value);
	    else
	    {
	        if(is_object($object))
	        {
	            $var = get_object_vars($object);
	            foreach($var as $key => $value)
	                //$return[$key] = ($key && empty($value)) ? null : soap::object2array($value);
	                $return[$key] = ($key && !isset($value)) ? null : common::object2array($value);
	        }
	        else
	            return (string)$object;
	    }
	
	    return $return;
	}

	public static function array2patch( $fileName, $xml2nd=null )
	{
		$ret = 'file not found.';
		$xml = "var/data/{$fileName}.xml";
		if (file_exists( $xml ))
		{
		    $xml = simplexml_load_file($xml);
		    $retArray   = $xml->xpath($xml2nd);
			$ret = common::object2array($retArray);
			print_r($xml);
		}

		return $ret;
	}

}
